package edu.nuist.unit02;

/**
 * @author wangzhuangzhuang
 * @DESC:
 * @date 2022-04-22 20:46
 */
public class VolatileUsageExample {

}

class VolatileFeaturesExample01 {
	volatile long vl = 0L; // 使用volatile声明64为的long型变量

	public void set(long l) {
		vl = l; // 单个volatile变量的写
	}

	public void getAndIncrement() {
		vl++; // 复合（多个）volatile变量的读/写
	}

	public long get() {
		return vl; // 单个volatile变量的读
	}
}

// 假设有多个线程分别调用上面程序的3个方法，这个程序在语义上和下面程序等价。
class VolatileFeaturesExample02 {
	long vl = 0L; // 64位的long型普通变量

	public synchronized void set(long l) { // 对单个的普通变量的写用同一个锁同步
		vl = l;
	}

	public void getAndIncrement() {
		long temp = get(); // 调用已同步的读方法
		temp += 1L; // 普通写操作
		set(temp);  // 调用已同步的写方法
	}

	public synchronized long get() { // 对单个的普通变量的读用同一个锁同步
		return vl;
	}
}